<?php
namespace app\common\service;

use think\Service;

class CommandService extends Service
{
    public function boot()
    {
        //将app目录下所有子目录中的command内命令行统一注册
        $this->commands($this->scanCommands(root_path() . 'app'));
    }


    /**
     * 扫描应用目录，收集所有命令行的信息
     * @param string $appDir 应用目录路径
     * @return array 命令行信息的关联数组
     */
    function scanCommands(string $appDir = __DIR__ . '/app'): array
    {
        $commands = [];

        // 检查目录是否存在
        if (!is_dir($appDir)) {
            return $commands;
        }

        // 获取所有子目录
        $dirs = glob($appDir . '/*', GLOB_ONLYDIR);

        foreach ($dirs as $dir) {
            $moduleName = basename($dir);
            if ($moduleName === 'command') {
                $commandDir = $dir;
            } else {
                $commandDir = $dir . '/command';
            }


            // 检查command目录是否存在
            if (is_dir($commandDir)) {
                // 获取command目录下的所有PHP文件
                $commandFiles = glob($commandDir . '/*.php');

                foreach ($commandFiles as $file) {
                    $fileName = basename($file, '.php');
                    $namespace = $this->getClassNamespace($file);

                    // 如果找不到命名空间，使用模块名作为命名空间的一部分
                    if (empty($namespace)) {
                        if ($moduleName === 'command') {
                            $namespace = "app\\{$moduleName}";
                        } else {
                            $namespace = "app\\{$moduleName}\\command";
                        }

                    }

                    $commandClass = "{$namespace}\\{$fileName}";

                    // 检查类是否存在
                    if (class_exists($commandClass)) {
                        if (in_array($moduleName, ['command', 'common'])) {
                            $moduleName = 'base';
                        }
                        $commands[$moduleName . ':' . $fileName] = $commandClass;
                    }
                }
            }
        }

        return $commands;
    }

    /**
     * 从PHP文件中提取类的命名空间
     * @param string $filePath PHP文件路径
     * @return string 命名空间，如果没有则为空字符串
     */
    function getClassNamespace(string $filePath): string
    {
        $namespace = '';
        $content = file_get_contents($filePath);

        if (preg_match('/namespace\s+([^;]+);/', $content, $matches)) {
            $namespace = trim($matches[1]);
        }

        return $namespace;
    }
}